# 实现一个命令行版本的学生管理系统
import os
import sys

# 使用这个全局变量来管理所有的学生信息
# 这个列表的每个元素都是一个“字典”，每个字典分别表示一个同学
students = []

def save():
    """
    存档函数
    """
    # 此处的路径不是以d:开头的“绝对路径”，而是相对路径
    # 这个写法的含义就是让recode.txt和当前的StudentManagement.py在同一个目录里
    with open('record.txt', 'w', encoding='utf8') as f:
        for s in students:
            f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['className']}\n")
    print(f"[存档成功] 共存储了 {len(students)} 条记录!")

def load():
    """
    读档函数
    """
    # 如果存档文件不存在, 则直接跳过读档环节
    # 为了避免读方式打开文件时，文件不存在引起异常
    if not os.path.exists('record.txt'):
        return
    # 读档时要先保证把旧的数据给清理干净
    global students
    students = []
    with open('record.txt', 'r', encoding='utf8') as f:
        for line in f:
            # 按照这一行数据，按照 \t 进行切分操作
            # 去掉一个字符串开头和末尾的空白符（空格、换行、回车、制表符、翻页符、垂直制表符）
            line = line.strip()
            tokens = line.split('\t')
            if len(tokens) < 4:
                print(f"文件格式有误! line={line}")
                continue
            student = {
                'studentId': tokens[0],
                'name': tokens[1],
                'gender': tokens[2],
                'className': tokens[3]
            }
            students.append(student)
    print(f"[读档成功] 共读取了 {len(students)} 条记录!")

def menu():
    """
    显示程序菜单
    """
    print(" 1. 新增学生信息")
    print(" 2. 显示所有学生信息")
    print(" 3. 查找学生信息")
    print(" 4. 删除学生信息")
    print(" 0. 退出程序")
    choice = input(" 请输入您的选择: ")
    return int(choice)

def insert():
    print("[新增学生] 开始!")
    studentId = input("请输入学生的学号: ")
    name = input("请输入学生的姓名: ")
    gender = input("请输入学生的性别: ")
    if gender not in ('男', '女'):
        print("性别不符合要求，新增学生失败!")
        return
    className = input("请输入学生的班级: ")
    # 使用一个字典把上述信息聚合起来，表示学生信息
    student = {
        'studentId': studentId,
        'name': name,
        'gender': gender,
        'className': className
    }
    # 把字典添加到学生列表中
    global students
    students.append(student)
    # 新增保存操作
    save()
    print("[新增学生] 完毕!")

def show():
    # 遍历全局变量的这个列表，把每个学生的信息打印出来
    print("[显示学生] 开始!")
    for s in students:
        print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
    print(f"[显示学生] 完毕，共显示了 {len(students)} 条记录!")

def find():
    # 根据学生姓名进行查找
    print("[查找学生] 开始!")
    name = input("请输入要查找的同学姓名: ")
    count = 0
    for s in students:
        if name == s['name']:
            print(f"[{s['studentId']}]\t{s['name']}\t{s['gender']}\t{s['className']}")
            count += 1
    print(f"[查找学生] 完毕，共查找到 {count} 条记录!")

def delete():
    print("[删除学生] 开始!")
    studentId = input("请输入要删除的同学学号: ")
    # 看看这个学号对应的同学是哪个字典，然后把这个字典从列表中删除即可
    count = 0
    for s in students:
        if studentId == s['studentId']:
            print(f"删除 {s['name']} 同学的信息!")
            students.remove(s)
            count += 1
    # 新增保存操作
    save()
    print(f"[删除学生] 完毕，共删除 {count} 条记录!")

def main():
    """
    入口函数
    """
    # 通过控制台和用户进行交换
    print('+----------------------------+')
    print('|     欢迎来带学生管理系统!     |')
    print('+----------------------------+')
    # 需要在程序启动时调用 load 即可
    load()
    while True:
        # 通过 menu 函数打印出菜单项
        choice = menu()
        if choice == 1:
            # 新增学生信息
            insert()
        elif choice == 2:
            # 显示所有学生信息
            show()
        elif choice == 3:
            # 查找学生信息
            find()
        elif choice == 4:
            # 删除学生信息
            delete()
        elif choice == 0:
            # 退出程序
            print("goodbye!")
            sys.exit(0)
        else:
            print('您的输入有误，请重新输入!')
            # 需要进入下次循环，让用户重新输入
            # continue

main()